#ifndef LINUX_TIMER_H
#define LINUX_TIMER_H

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

/* 系统滴答计数类型（模拟Linux的jiffies，单位：滴答数） */
typedef uint32_t jiffies_t;

/* 定时器回调函数类型
 * 参数：用户自定义数据
 */
typedef void (*timer_func_t)(void *data);

/* 定时器结构体（模拟Linux的struct timer_list）
 * 注：Linux中使用双向链表，此处简化为单向链表，保留核心字段
 */
typedef struct linux_timer {
    struct linux_timer *next;       /* 链表节点：用于连接定时器 */
    jiffies_t expires;              /* 超时滴答数（达到此值触发） */
    timer_func_t function;          /* 超时回调函数 */
    void *data;                     /* 用户数据 */
    bool periodic;                  /* 是否周期触发：true=周期，false=单次 */
    uint32_t interval;              /* 周期模式的间隔（滴答数），单次模式无效 */
    bool active;                    /* 是否激活：true=在链表中，false=未激活 */
} linux_timer_t;

/* 初始化定时器模块
 * 功能：初始化系统滴答计数和定时器链表
 */
void linux_timer_init(void);

/* 初始化单个定时器（类似Linux的init_timer）
 * 参数：
 *   timer：定时器指针
 *   func：回调函数
 *   data：用户数据
 *   periodic：是否周期模式
 *   interval：周期模式的间隔（滴答数）
 */
void linux_timer_setup(linux_timer_t *timer, timer_func_t func, void *data,
                      bool periodic, uint32_t interval);

/* 启动定时器（类似Linux的add_timer）
 * 参数：
 *   timer：定时器指针
 *   expires_ms：超时时间（毫秒），内部转换为滴答数
 * 功能：将定时器加入链表，设置超时时间
 */
void linux_timer_start(linux_timer_t *timer, uint32_t expires_ms);

/* 停止定时器（类似Linux的del_timer）
 * 参数：timer：定时器指针
 * 功能：将定时器从链表中移除，标记为未激活
 */
void linux_timer_stop(linux_timer_t *timer);

/* 定时器心跳函数（类似Linux的timer interrupt handler）
 * 功能：递增系统滴答计数，检查并触发超时的定时器
 * 注：需由硬件定时器周期性调用（推荐1ms一次，即1个滴答=1ms）
 */
void linux_timer_tick(void);

/* 获取当前系统滴答数（类似Linux的get_jiffies_64） */
jiffies_t linux_timer_get_jiffies(void);

#endif